NHibernate তে Cascade Operations এবং Fetching Strategy খুবই গুরুত্বপূর্ণ ফিচার, যা সম্পর্কিত এনটিটিগুলোর মধ্যে ডেটার ব্যবস্থাপনা এবং লোডিং কিভাবে করা হবে তা নির্ধারণ করে।
এখানে, Cascade Operations এবং Fetching Strategy কিভাবে কনফিগার করতে হয় তা বিস্তারিতভাবে আলোচনা করা হবে।
Cascade Operation
Cascade Operations ব্যবহার করলে, আপনি একটি এন্টিটির উপর একটি অপারেশন (যেমন, Save, Update, Delete) চালালে এটি সেই এন্টিটির সম্পর্কিত অন্যান্য এন্টিটিতেও স্বয়ংক্রিয়ভাবে একই অপারেশন প্রয়োগ করবে। অর্থাৎ, একটি এন্টিটির উপর অপারেশন করার সময় তার সংশ্লিষ্ট সম্পর্কিত এন্টিটিগুলিতে Cascade প্রয়োগ করা হয়।
NHibernate তে Cascade নির্ধারণ করতে আপনি Entity Class এবং Mapping File এ কিছু কনফিগারেশন করতে পারেন।
Cascade Types
NHibernate তে বিভিন্ন Cascade Type রয়েছে, যার মধ্যে কিছু সাধারণ Cascade Types হল:
- Cascade.All: সমস্ত অপারেশন (Save, Update, Delete) সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
- Cascade.SaveUpdate: শুধুমাত্র Save এবং Update অপারেশন সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
- Cascade.Delete: শুধুমাত্র Delete অপারেশন সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
- Cascade.Merge: Merge অপারেশন সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
- Cascade.Persist: Persist অপারেশন সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
- Cascade.Refresh: Refresh অপারেশন সম্পর্কিত এন্টিটিতে প্রয়োগ হবে।
Cascade কনফিগার করা (XML Mapping)
এখন, যদি আপনার Employee এবং Department এর মধ্যে একটি সম্পর্ক থাকে এবং আপনি চান যে, যখন একটি Employee সেভ হবে, তখন সংশ্লিষ্ট Departmentও সেভ হোক, তাহলে আপনাকে Cascade অপারেশন কনফিগার করতে হবে। উদাহরণস্বরূপ:
<class name="Employee" table="Employee">
<id name="Id" column="EmployeeID">
<generator class="identity"/>
</id>
<property name="Name" column="Name" />
<property name="Age" column="Age" />
<property name="Position" column="Position" />
<!-- Cascade configuration for the department -->
<many-to-one name="Department" class="Department" column="DepartmentID" cascade="save-update"/>
</class>
এখানে:
- cascade="save-update": এর মাধ্যমে
Employeeসেভ বা আপডেট করলে সংশ্লিষ্টDepartmentসেভ বা আপডেট হবে।
Cascade কনফিগার করা (Fluent Mapping)
Fluent Mapping এ Cascade কনফিগার করার উদাহরণ:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Table("Employee");
Id(x => x.Id).Column("EmployeeID").GeneratedBy.Identity();
Map(x => x.Name).Column("Name");
Map(x => x.Age).Column("Age");
Map(x => x.Position).Column("Position");
// Cascade configuration for the Department entity
References(x => x.Department)
.Column("DepartmentID")
.Cascade.SaveUpdate(); // Cascade Save and Update
}
}
এখানে:
- Cascade.SaveUpdate(): এটি নিশ্চিত করবে যে, যখন
Employeeসেভ বা আপডেট হবে, তখন সংশ্লিষ্টDepartmentসেভ বা আপডেট হবে।
Fetching Strategy
Fetching Strategy নির্ধারণ করে কিভাবে সম্পর্কিত ডেটা (এনটিটি) লোড করা হবে। NHibernate দুটি প্রধান Fetching Strategy প্রদান করে: Lazy Loading এবং Eager Loading।
Lazy Loading
Lazy Loading হল একটি টেকনিক যেখানে সম্পর্কিত ডেটা শুধুমাত্র তখনই লোড হবে, যখন সেটি আসলেই প্রয়োজন হবে। এটি পারফরম্যান্স বাড়ানোর জন্য ব্যবহৃত হয়, কারণ ডেটাবেস থেকে অতিরিক্ত ডেটা লোড করা হয় না যতক্ষণ না সেটি প্রয়োজন।
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Department Department { get; set; } // Lazy-loaded relationship
}
এখানে, Department সম্পর্কটি Lazy Loading এ রয়েছে। অর্থাৎ, Department ডেটা শুধুমাত্র তখনই লোড হবে যখন তার প্রয়োজন হবে, যেমন:
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var employee = session.Get<Employee>(1);
Console.WriteLine(employee.Department.Name); // Department data will be loaded here
}
Eager Loading
Eager Loading হল একটি টেকনিক যেখানে সম্পর্কিত ডেটা একসাথে লোড করা হয়, অর্থাৎ মূল অবজেক্ট লোড হওয়ার সাথে সাথে সম্পর্কিত সমস্ত ডেটা ডেটাবেস থেকে লোড হয়ে আসে। এটি তখন ব্যবহৃত হয় যখন আপনি নিশ্চিত যে সম্পর্কিত ডেটা আপনাকে প্রাথমিকভাবে প্রয়োজন।
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Department Department { get; set; } // Eager-loaded relationship
}
Eager Loading কনফিগার করার জন্য Fetch ব্যবহার করতে হয়।
<many-to-one name="Department" class="Department" column="DepartmentID" fetch="join"/>
এখানে:
- fetch="join": এটি নিশ্চিত করবে যে, যখন
Employeeলোড হবে, তখন সাথে সাথেDepartmentসম্পর্কিত ডেটা একসাথে লোড হবে।
Fetching Strategy কনফিগার করা (Fluent Mapping)
Fluent Mapping এ Eager এবং Lazy Loading কনফিগার করা:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Table("Employee");
Id(x => x.Id).Column("EmployeeID").GeneratedBy.Identity();
Map(x => x.Name).Column("Name");
// Eager loading for Department
References(x => x.Department)
.Column("DepartmentID")
.Fetch.Join(); // Fetch department data with employee
// Lazy loading example:
// References(x => x.Department)
// .Column("DepartmentID")
// .LazyLoad();
}
}
এখানে:
- Fetch.Join() ব্যবহার করা হয়েছে যাতে Department সম্পর্কিত ডেটা
Employeeসেশন লোড হওয়ার সাথে সাথে লোড হয়ে আসে।
Cascade এবং Fetching Strategy এর গুরুত্ব
- Cascade অপারেশন ডেটাবেসের মধ্যে সম্পর্কিত টেবিলগুলির মধ্যে ডেটার স্বয়ংক্রিয় প্রক্রিয়া পরিচালনা করে, যাতে আপনি এক ক্লাসে পরিবর্তন করলে অন্য ক্লাসের ডেটাও আপডেট করতে পারেন।
- Fetching Strategy আপনাকে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়তা করে, কারণ এটি ডেটাবেস থেকে অপ্রয়োজনীয় ডেটা লোড করা এড়িয়ে যায়।
এই কনফিগারেশনগুলো ব্যবহার করে আপনি ডেটাবেস অপারেশনগুলো আরো দক্ষ এবং কার্যকরভাবে পরিচালনা করতে পারবেন।
Read more